﻿using System;
using System.Text;

[Serializable]

public class DatosDeUsuario : Encapsulado
{
    #region Atributos de la clase

    protected string nombre, login, password;

    #endregion

    #region Tamaños de los atributos cadena

    public const int TAM_NOMBRE = 100;
    public const int TAM_LOGIN = 20;

    #endregion

    #region Métodos de acceso

    protected string getNombre()
    {
        return this.nombre;
    }
    protected void setNombre(string pNombre)
    {
        if (pNombre == null)
            pNombre = "";
        this.nombre = pNombre;
    }

    protected string getLogin()
    {
        return this.login;
    }
    protected void setLogin(string pLogin)
    {
        if (pLogin == null)
            this.login = "";
        this.login = pLogin;
    }

    protected string getPassword()
    {
        return this.password;
    }
    protected void setPassword(string pPassword)
    {
        this.password = pPassword;
    }

    protected void setDatosDeUsuario(DatosDeUsuario pDatosUsuario)
    {
        this.setNombre(pDatosUsuario.Nombre);
        this.setLogin(pDatosUsuario.Login);
        this.setPassword(pDatosUsuario.Password);
    }

    #endregion

    #region Propiedades públicas

    virtual public string Nombre
    {
        get { return this.getNombre(); }
        set { this.setNombre(value); }
    }
    virtual public string Login
    {
        get { return this.getLogin(); }
        set { this.setLogin(value); }
    }
    virtual public string Password
    {
        get { return this.getPassword(); }
        set { this.setPassword(value); }
    }

    #endregion

    #region Contructores

    /**
        * \brief Constructor de la clase DatosDeUsuario.
        * \return El objeto DatosDeUsuario inicializado y listo para ser usado.
        * \param pId - Número identificador del objeto DatosDeUsuario.
        * \param pNombre - Nombre del Usuario.
        * \param pLogin - Login del Usuario.
        * \param pActivo - Actividad de los DatosDeUsuario.
        */
    internal DatosDeUsuario(ulong pId, string pNombre, string pLogin, string pPassword)
        : base(pId)
    {
        this.setNombre(pNombre);
        this.setLogin(pLogin);
        this.setPassword(pPassword);
    }

    /**
    * \brief Constructor de la clase DatosDeUsuario.
    * \return El objeto DatosDeUsuario inicializado y listo para ser usado.
    * \param pId - Número identificador del objeto DatosDeUsuario.
    * \param pNombre - Nombre del Usuario.
    * \param pLogin - Login del Usuario.
    * \param pActivo - Actividad de los DatosDeUsuario.
    */
    public DatosDeUsuario(string pNombre, string pLogin, string pPassword) : base(0)
	{
        this.setNombre(pNombre);
		this.setLogin(pLogin);
        this.setPassword(pPassword);
 	}

    /**
    * \brief Constructor de copia público (para la interfaz) de la clase DatosDeUsuario.
    * \return El objeto DatosDeUsuario inicializado y listo para ser usado.
    * \param pDatosUsuario - Datos sobre los que construir el objeto DatosDeUsuario.
    */
    protected DatosDeUsuario(DatosDeUsuario pDatosUsuario) : base(pDatosUsuario)
    {
        this.setDatosDeUsuario(pDatosUsuario);
    }

    #endregion

    #region Métodos Adicionales

    /**
        * \brief Sobrecarga del operador de conversión a string de un DatosDeUsuario.
        * \return Un string con la información de la clase DatosDeUsuario del objeto.
        */
    public override string ToString()
    {
        StringBuilder cadena = new StringBuilder("Usuario con nombre: " + this.getNombre() + " y login: " + this.getLogin() + ". ");

        return cadena.ToString();
    }

    /**
        * \brief Sobrecarga del operador del codigo hash de un DatosDeUsuario.
        * \return Un entero con el codigo Hash de la clase DatosDeUsuario.
        */
    public override int GetHashCode()
    {
        //Definimos un numero entero primo
        int primo = 31;
        int resultado = 1;

        //Hashcode para nombre (string)
        resultado = primo * resultado + ((this.nombre == null) ? 0 : this.nombre.GetHashCode());
        //Hashcode para login (string)
        resultado = primo * resultado + ((this.login == null) ? 0 : this.login.GetHashCode());

        //Hashcode para activo (enum)
        resultado = primo * resultado + ((this.password == null) ? 0 : this.password.GetHashCode());

        //Devolvemos el codigo Hash
        return resultado;
    }

    internal override Encapsulado dameCopiaEncapsulado()
    {
        return new DatosDeUsuario(this);
    }

    internal override void restaurarEncapsulado(Encapsulado pEncapsulado)
    {
        this.setDatosDeUsuario((DatosDeUsuario)pEncapsulado);
    }
        
    #endregion

}
